package com.texaco.chapasFutbol.entidades;

import org.andengine.engine.handler.IUpdateHandler;
import org.andengine.entity.IEntity;
import org.andengine.entity.sprite.Sprite;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.util.debug.Debug;

import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.texaco.chapasFutbol.R;

/**
 * Clase que implementa el sprite de las chapas. implementará aquellos métodos
 * referente a las chapas, como lanzar o golpear, tendrá los atributos
 * referentes a las chapas, como podría ser imagen de la chapa, y
 * caracteristicas propias de un jugador de futbol, como puede ser potencia de
 * disparo.
 * 
 * @author texaco
 * 
 */
public class Chapa extends CFSprite implements IUpdateHandler {
	public final static int HEIGHT = 67;
	public final static int WIDTH = 67;
	
	public final static String CHAPA_USER_DATA = "soy una chapa";

	/**
	 * Definición de la física para la chapa.
	 */
	public final static FixtureDef FIXTURE = PhysicsFactory.createFixtureDef(
			5f, 0.5f, 1f, false, CFSprite.CAT_CHAPA, CFSprite.MASK_CHAPA, (short)0);
	private Sprite sombra;

	public Chapa(int xPos, int yPos, ITextureRegion shape,
			VertexBufferObjectManager vertex, Game game, float damping) {
		super(xPos, yPos, shape, vertex, game, damping, CHAPA_USER_DATA);
		this.registerUpdateHandler(new IUpdateHandler() {
			
			public void reset() {
			}
			
			public void onUpdate(float pSecondsElapsed) {
				Chapa.this.sombra.setPosition(Chapa.this.getX() + Chapa.this.game.getActivity().getResources().getInteger(R.integer.sombra_x_offset), 
						Chapa.this.getY() + Chapa.this.game.getActivity().getResources().getInteger(R.integer.sombra_y_offset));
			}
		});
	}

	@Override
	public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
			final float pTouchAreaLocalX, final float pTouchAreaLocalY) {

		if (game.getEstado().isJuegoActivo()) {

			/*
			 * Crear una nueva chapa y seguirla Hay que detectar si se ha
			 * soltado o se está arrastrando. en el momento que la suelte,
			 * requiere mover la chapa generadora.
			 */
			if ((this instanceof ChapaLocal && game.isTurnoLocal())
					|| (this instanceof ChapaVisitante && game
							.isTurnoVisitante())) {
				if (pSceneTouchEvent.isActionDown()) {
					/*
					 * Se crea la chapa fantasma.
					 */
					game.chapaPulsada(this, pSceneTouchEvent);
				}
			}
		}
		return true;
	}

	/**
	 * Mueve la chapa una vez que se pulsa.
	 * 
	 * @param pSceneTouchEvent
	 */
	public void mover(TouchEvent pSceneTouchEvent) {
		Debug.d("Moviendo chapa");
		Debug.d("Posicion X: " + this.getX() + " Posicion Y: " + this.getY());
		Debug.d("Posicion evento X: " + pSceneTouchEvent.getX()
				+ " Posicion Y: " + pSceneTouchEvent.getY());
		float diferenceX = this.getX() + WIDTH / 2 - pSceneTouchEvent.getX();
		float diferenceY = this.getY() + HEIGHT / 2 - pSceneTouchEvent.getY();

		Debug.d("Diferencia X: " + diferenceX + " Diferencia Y: " + diferenceY);

		super.mover(diferenceX, diferenceY);
	}

	public void setSombra(Sprite sombra) {
		this.sombra = sombra;
	}

	public IEntity getSombra() {
		return this.sombra;
	}
}
